import { BrowserWindowConstructorOptions } from 'electron';

/**
 * Boltron 应用程序配置选项
 */
export interface BoltronConfig {
  /**
   * 安全相关配置
   */
  security?: {
    /**
     * 内容安全策略
     */
    contentSecurityPolicy?: string;
    
    /**
     * 是否启用沙盒
     * @default true
     */
    sandbox?: boolean;
    
    /**
     * 是否启用上下文隔离
     * @default true
     */
    contextIsolation?: boolean;
  };
  
  /**
   * 预加载脚本路径或配置
   */
  preload?: string | {
    /**
     * 预加载脚本路径
     */
    path: string;
    
    /**
     * 是否自动生成预加载脚本
     * @default true
     */
    autoGenerate?: boolean;
  };
}

/**
 * 窗口创建选项
 */
export interface WindowOptions extends BrowserWindowConstructorOptions {
  /**
   * 窗口加载的 URL
   */
  url: string;
  
  /**
   * 是否自动显示窗口
   * @default false
   */
  autoShow?: boolean;
  
  /**
   * 是否在创建时立即加载 URL
   * @default true
   */
  loadImmediately?: boolean;
}

/**
 * IPC 处理器类型
 */
export interface IpcHandler {
  [methodName: string]: (...args: any[]) => any;
}

/**
 * IPC 方法描述
 */
export interface IpcMethodDescription {
  args: any[];
  return: any;
}

/**
 * IPC 方法描述的模式
 */
export interface IpcSchema {
  [methodName: string]: IpcMethodDescription;
}

/**
 * Boltron 插件接口
 */
export interface BoltronPlugin {
  /**
   * 插件名称
   */
  name: string;
  
  /**
   * 插件初始化方法
   */
  init: (app: any) => void | Promise<void>;
  
  /**
   * 插件卸载方法
   */
  destroy?: () => void | Promise<void>;
}

/**
 * Vite 插件选项
 */
export interface PluginOptions {
  /**
   * 主进程入口文件
   * 仅在开发模式下用于启动 Electron
   * @deprecated 不再使用
   */
  mainEntry?: string;
  
  /**
   * 预加载脚本输出路径
   */
  preloadOutput: string;
  
  /**
   * 类型定义文件输出路径
   * 如果不提供，将默认为预加载脚本路径加上 .d.ts 后缀
   */
  typesOutput?: string;
  
  /**
   * 是否开启开发模式
   * @default process.env.NODE_ENV !== 'production'
   * @deprecated 不再使用
   */
  dev?: boolean;
}

/**
 * 动态生成预加载类型的工具类型
 */
export type GeneratePreloadTypes<T extends IpcSchema> = {
  Main: { [K in keyof T]: (...args: T[K]['args']) => Promise<T[K]['return']> };
  Renderer: { [K in keyof T]: (callback: (...args: T[K]['args']) => void) => void };
} 